package com.wangzhen.spring.validation;

import com.wangzhen.spring.ioc.dependcy.entity.User;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;

import java.util.List;
import java.util.Locale;

public class ErrorMessageDemo {

    public static void main(String[] args) {
        // 1、声明User对象
        User user = new User();
        user.setName("张三");
        // 2、使用MessageSource的子类ResourceBundleMessageSource来加载资源文件
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        // 在这里使用ResourceBundleMessageSource关联配置文件时，测试的结果是只需要指定文件名，
        // 不需要指定文件名的后缀，如果指定的basename=message.properties反而关联不到
        messageSource.setBasename("message");
        messageSource.setDefaultEncoding("UTF-8");

        // 3、选择Errors的具体实现 BeanPropertyBindingResult
        Errors errors = new BeanPropertyBindingResult(user, "user");
        // 3.1、调用reject方法生成ObejectError
        // 3.2、调用rejectValue方法生成FieldError
        errors.reject("user.notnull");
        // 底层是BeanPropertyBindingResult会利用反射获取name字段的值
        errors.rejectValue("name", "user.name.notnull");

        // 获取所有reject方法生成的ObjectError
        List<ObjectError> globalErrors = errors.getGlobalErrors();
        // 获取所有rejectValue生成的FieldError
        List<FieldError> fieldErrors = errors.getFieldErrors();
        // 获取所有reject+rejectValue生成的Error FieldError is ObjectError(继承自ObjectError)
        List<ObjectError> allErrors = errors.getAllErrors();

        // 4、通过ObjectError或者FieldError中的code和args 获取关联MessageSource的文案
        for (ObjectError error : allErrors) {
            System.out.println(messageSource.getMessage(error.getCode(), error.getArguments(), Locale.getDefault()));
        }

    }
}
